package com.zhanghe.study.study_scala.collection

/**
 * 集合操作
 *
 * @author zh
 * @date 2021/5/8 17:09
 */
object TestCollectionOperator {
  def main(args: Array[String]): Unit = {
    // 高阶函数
    println(test(double, 2))

    // 就像java8中的stream操作
    // java8中的很多操作都是从scala中吸取过来的
    println("集合的map映射=====")
    val listInt: List[Int] = List(1, 2, 3)
    // 将listInt集合元素遍历，将各个元素传递给double方法，得到新的值，将得到的新的值放入到新的集合
    val list = listInt.map(double)
    println(list)


    println("集合的flatmap映射=====")
    val listString = List[String]("Tom", "Jack")
    val list1 = listString.flatMap(upper)
    // List(T, O, M, J, A, C, K)
    println(list1)

    println("集合的filter过滤====")
    val list2 = listInt.filter(even)
    // List(2)
    println(list2)

    println("集合的reduce化简====")
    // 接收两个参数，返回一个
    // def reduce[B >: A](op: (B, B) => B): B = reduceLeft(op)
    // reduceLeft的运行是 从左边开始执行将得到的结果返回给第一个参数，然后继续和下一个参数运行，直到结束
    val sum = listInt.reduce(add)
    // 6
    println(sum)

    println("集合的fold折叠====")
    val sum01 = listInt.fold(0)(add)
    // 6
    println(sum01)

    println("集合的scan扫描====")
    val list3 = listInt.scan(0)(add)
    // List(0, 1, 3, 6)
    println(list3)

    // 拉链合并
    val listInt1: List[Int] = List(1, 2, 3)
    val listInt2: List[Int] = List(4, 5, 6)
    val listInt3 = listInt1.zip(listInt2)
    // List((1,4), (2,5), (3,6))
    println(listInt3)

  }

  // 高阶函数，就是可以接受函数参数的函数
  // f:Int => Int  表示一个函数，接收Int类型参数，返回Int
  // n1:Int  是一个普通参数
  def test(f: Int => Int, n1: Int): Int = {
    // 执行所传入的函数
    f(n1)
  }

  def double(d: Int) = {
    println("传入值为" + d)
    2 * d
  }

  // f: () => Unit表示无参，返回值为Unit
  def test2(f: () => Unit): Unit = {

  }

  def upper(s: String) = {
    s.toUpperCase
  }

  def even(num: Int): Boolean = {
    if (num % 2 == 0) {
      true
    } else {
      false
    }
  }

  def add(num1: Int, num2: Int): Int = {
    num1 + num2
  }
}
